home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 210_01 / nuxb.asm < prev    next >
Assembly Source File  |  1980-01-01  |  4KB  |  168 lines

  1.     TITLE 'Loadable bios module for CP/M v.2.2'
  2.     PAGE 62
  3.  
  4. ;9/20/86--N.T.Carnevale
  5. ;After C.Sondgeroth's XBIOS--see Micro/Systems Journal vol.1 #2 p.66 et seq.
  6. ;See also my article in the July/August 1986 issue of M/S J pp.72-85.
  7. ;
  8. ;7/12/85 Modified to allow use of a general xbios loader,
  9. ;and to enable use of a special utility to remove xbios's--NTC
  10. ;Compile with RMAC, then link like so:
  11. ;
  12. ;    link nuxb[os]
  13. ;
  14. ;to produce an .SPR file for use by the bios extension loader LXB
  15.  
  16.  
  17. CR    EQU    0DH
  18. LF    EQU    0AH
  19. CDISK    EQU    4    ;addr holds currently logged drive
  20. PRINTF    EQU    9    ;bdos "print string" function
  21.  
  22.  
  23. ;These macros code for strings to identify the bios extension.
  24. ;To allow easy manipulation by C programs, each macro should 
  25. ;end with a null.
  26. ;NOTE:    the total length of the data produced by these two macros 
  27. ;must be 225 bytes or less.
  28.  
  29. VERSION MACRO
  30.     ;; revision number & date
  31.     ;; terminate this macro with a null
  32.     DB 'v.1.1 7/12/85'
  33.     DB 0
  34.     ENDM
  35.  
  36. FUNCT    MACRO
  37.     ;; tell what it's for
  38.     ;; put in as many lines as desired, with cr lf as needed
  39.     ;; restrictions:  
  40.     ;; --terminate this macro with a null
  41.     ;; --total length of the data produced by the version and funct
  42.     ;;   macros must be 255 bytes or less  
  43.     DB 'Tests new version'
  44.     DB 0
  45.     ENDM
  46.  
  47.  
  48. ;**********************
  49. ;This header identifies the xbios module and provides vital information
  50. ;used by the loader and other utilities
  51.  
  52.     ;"continuation jump" to bdos--patched to correct location
  53.     ;by xbios loader.  If this is the only xbios module, this 
  54.     ;jmp goes directly to the original bdos.  Otherwise, it 
  55.     ;goes to the xbios module that was previously loaded.
  56. BDOS:    JMP $-$
  57.  
  58.     ;distance from end of this header to the local copy 
  59.     ;of the original bios's entry table, i.e. total length 
  60.     ;of the version and function strings.
  61.     DB OLDTBL-HDREND
  62.  
  63.     ;how many jump instructions copied from the bios's table
  64.     DB (TBLEND - OLDTBL)/3
  65.  
  66.     ;Next 11 bytes reserved for future use
  67. RESERV: DB 0
  68.     DW 0,0,0,0,0
  69.  
  70.     ;The next string, which is exactly 16 bytes long and starts 
  71.     ;exactly 16 bytes from the first location in the xbios,
  72.     ;is checked by utilities that manipulate resident xbios modules.
  73. LABEL:    DB 'xbios installed$'
  74.  
  75. HDREND    EQU $
  76.  
  77. ;end of fixed-length header
  78. ;**********************
  79.  
  80.  
  81.     ;strings that tell what it is & what it does
  82.     VERSION
  83.     FUNCT
  84.  
  85.  
  86. ;When the bios extension is first installed, the contents of the
  87. ;original bios jump table are copied into the following table.
  88. ;These jumps allow calls to any bios routines that are not 
  89. ;supposed to be intercepted. 
  90. ;If your bios has additional jumps that you might want to intercept,
  91. ;add more entries to this table
  92.  
  93. OLDTBL    EQU $
  94.  
  95. WBOOT    JMP $-$
  96. CONST    JMP $-$
  97. CONIN    JMP $-$
  98. CONOUT    JMP $-$
  99. LIST    JMP $-$
  100. PUNCH    JMP $-$
  101. READER    JMP $-$
  102. HOME    JMP $-$
  103. SELDSK    JMP $-$
  104. SETTRK    JMP $-$
  105. SETSEC    JMP $-$
  106. SETDMA    JMP $-$
  107. READ    JMP $-$
  108. WRITE    JMP $-$
  109. LISTS    JMP $-$
  110. SECTRAN JMP $-$
  111.  
  112. TBLEND    EQU $
  113.  
  114.  
  115. ;This table should be the same length as the OLDTBL.
  116. ;It defines new entry points for the bios routines that
  117. ;are to be modified.  Any routines that are not to be intercepted
  118. ;should jump to the corresponding entries in the previous table.
  119. ;Eventually they will reach the original bios entry points.
  120.  
  121. NEWTBL    EQU $
  122.  
  123.     JMP XWBOOT    ;to special bios extension "warm boot" routine. 
  124.             ;This is the only jump that cannot go to the 
  125.             ;corresponding entry in the previous table.
  126.     ;the rest of these may be modified to intercept the bios call
  127.     JMP CONST
  128.     JMP CONIN
  129.     JMP CONOUT
  130.     JMP LIST
  131.     JMP PUNCH
  132.     JMP READER
  133.     JMP HOME
  134.     JMP SELDSK
  135.     JMP SETTRK
  136.     JMP SETSEC
  137.     JMP SETDMA
  138.     JMP READ
  139.     JMP WRITE
  140.     JMP LISTS
  141.     JMP SECTRAN
  142.  
  143.  
  144. ;This is the special warm boot routine that intercepts CP/M's attempt
  145. ;to overwrite the call to the bios extension's own jump table.    It
  146. ;bypasses the reload of the CCP and reinitialization of the low memory
  147. ;jump vectors that are part of a normal CP/M 2.2 warm boot.
  148. XWBOOT:    LXI SP,80H    ;reset stack pointer
  149.     LXI B,80H    ;set default dma address
  150.     CALL SETDMA
  151.     LXI H,BDOS
  152.     SHLD 6        ;fix "jmp bdos" at 0005 to point to this module
  153.     LXI D,CRLF
  154.     MVI C,PRINTF
  155.     CALL BDOS    ;send cr lf to console
  156.     LXI D,LABEL
  157.     MVI C,PRINTF
  158.     CALL BDOS    ;say xbios is running
  159.     LHLD 1        ;get bios+3 address
  160.     LXI D,-1600H    ;calculate entry point of CCP
  161.     DAD D
  162.     LDA CDISK
  163.     MOV C,A
  164.     PCHL        ;jump into CCP
  165.  
  166. CRLF:    DB CR,LF,'$'
  167.     END
  168.